Как использовать «это» в функции-члене? - PullRequest
1 голос
/ 04 мая 2010

Я написал функцию-член класса Node для чтения дерева узлов в порядке постфикса.

Он будет вызываться экземпляром Node, который является корневым узлом дерева.

Итак: N.postfix ();

они кажутся illeagal:

*this->left.postfix();
*this->right.postfix();

Как правильно это сделать?

class Node
{
public:
    const char *cargo; 
    int depth; 
    Node *left; 
    Node *right

void Node::postfix()
{
    if (this==__nullptr)
    {
        return;
    }
    else
    {
        *this->left.postfix();
        *this->right.postfix();
        out<<*this->cargo<<"\n";
        return;
    }
};

Ответы [ 3 ]

10 голосов
/ 04 мая 2010

В функции-члене вам обычно не нужно использовать this для доступа к членам класса; Вы можете просто использовать:

left->postfix();

и т.д.

Если у вас есть параметры функции или другие локальные переменные, которые имеют то же имя, что и переменная члена класса, вы можете использовать this для ссылки на переменную-член, например,

this->left->postfix();

Причина, по которой ваш код недопустим, заключается в том, что он неправильно обрабатывает left как указатель. Вам необходимо разыменовать left, используя ->, чтобы получить доступ к его членам, как показано в правильном коде здесь. (Вы также можете использовать эквивалент (*left).postfix(), но это просто заставляет вас использовать больше скобок без реальной выгоды.)

Использование оператора косвенности * в начале выражения также неверно, поскольку оно применяется к результату postfix() (т.е. оно разыменовывает все, что возвращается postfix()). postfix() ничего не возвращает, так что это ошибка. Важно помнить, что операторы . и -> имеют более высокий приоритет, чем *.

6 голосов
/ 04 мая 2010

Оператор -> разыменовывает указатель, поэтому дополнительный * вызовет проблемы. Вы можете сделать это:

this->left->postfix();

Или это:

(*this).left->postfix();
1 голос
/ 04 мая 2010

*this->left.postfix();

"Разблокировать возвращаемое значение вызова postfix () в переменной 'left' этого элемента."


this->left->postfix();
//or
(*this->left).postfix();

"Вызовите postfix () для разыменованной переменной 'left' этого элемента."

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...